package com.jqq.api.preparestatement;

import com.sun.javafx.scene.control.skin.VirtualFlow;
import org.junit.jupiter.api.Test;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 姬倩倩
 * @version 1.0
 * 使用preparedStatement进行t_user表的curd动作
 */
public class PSCURDPart {
    @Test
    public void testInsert() throws Exception {
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///test_q", "root", "123456");
        //3.编写SQL语句，动态值部分用?代替
        String sql = "insert into t_user(account,password,nickname) values(?,?,?);";
        //4.创建preparedStatement,传入SQL语句
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //5.占位符赋值
        preparedStatement.setObject(1, "test");
        preparedStatement.setObject(2, "test");
        preparedStatement.setObject(3, "二狗子");
        //6.发送SQL语句
        //DML类型
        int rows = preparedStatement.executeUpdate();
        //7.输出结果
        if(rows > 0){
            System.out.println("数据插入成功！");
        } else{
            System.out.println("数据插入失败！");
        }
        //8.关闭资源
        preparedStatement.close();
        connection.close();

    }
    @Test
    public void testUpdate() throws Exception {
        /**
         * 修改id=3的用户昵称 nickname = 三狗子
         */
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///test_q?user=root&password=123456");
        //3.编写SQL语句
        String sql = "update t_user set nickname = ? where id = ?;";
        //4.创建preparedStatement并为占位符赋值
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setObject(1, "三狗子");
        preparedStatement.setObject(2, 3);
        //5.发送SQL语句
        int rows = preparedStatement.executeUpdate();
        //6.输出结果
        if(rows > 0){
            System.out.println("数据修改成功！");
        } else{
            System.out.println("数据修改失败！");
        }
        //8.关闭资源
        preparedStatement.close();
        connection.close();

    }
    @Test
    public void testDelete() throws Exception {
    /**
     * 删除id=3的用户昵称 nickname = 三狗子
     */
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///test_q?user=root&password=123456");
        //3.编写SQL语句
        String sql = "delete from t_user where id = ?;";
        //4.创建preparedStatement并为占位符赋值
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setObject(1, 3);
        //5.发送SQL语句
        int rows = preparedStatement.executeUpdate();
        //6.输出结果
        if(rows > 0){
            System.out.println("数据删除成功！");
        } else{
            System.out.println("数据删除失败！");
        }
        //8.关闭资源
        preparedStatement.close();
        connection.close();
    }
    @Test
    public void testSelect() throws Exception {
    /**
     * 查询所有用户数据，并且封装到一个List<Map>的list集合中
     * map(key=列名，value=列的内容)->List<Map>
     * 实现思路：
     *      遍历行数据，一行对应一个map，获取一行的列名和对应的列的属性
     *      将map装到一个List集合中
     */
        //1.注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //2.获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql:///test_q?user=root&password=123456");
        //3.编写SQL语句
        String sql = "select * from t_user;";
        //4.创建preparedStatement并为占位符赋值
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        //5.发送SQL语句,得到结果集
        ResultSet resultSet = preparedStatement.executeQuery();
        //6.输出结果,并放到Map中
        List<Map> list = new ArrayList<>();

        //获取列信息对象
        //TODO:metaData装的当前结果集列的信息对象（可以根据下角标获取列的名称，获取列的数量）
        ResultSetMetaData metaData = resultSet.getMetaData();

        //有了它就可以水平遍历列了
        int columnCount = metaData.getColumnCount();

        while(resultSet.next()){
            Map map = new HashMap();
            
            //纯手动取值 不可取！
//            map.put("id", resultSet.getInt("id"));
//            map.put("account", resultSet.getString("account"));
//            map.put("password", resultSet.getString("account"));
//            map.put("nickname", resultSet.getString("nickname"));
            
            //自动遍历列 【1，总列数】
            for (int i = 1; i <= columnCount; i++) {
                //获取指定列下角标的值！resultSet
                Object value = resultSet.getObject(i);
                //获取指定列下角标的列的名称！ResultSetMetaData
                //使用getColumnLabel 会获取别名/列名 而不是getColumnName 只获取列名
                String columnLabel = metaData.getColumnLabel(i);
                map.put(columnLabel, value);
            }

            list.add(map);
        }
        System.out.println("list="+list);
        //8.关闭资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}
